GuardDutyの抑制ルールを活用してセキュリティ検知のノイズを減らす
はじめに
Amazon GuardDuty は驚異検知を行うセキュリティサービスです。 「ログの継続的な分析」および「ログに潜む脅威の検知」をマネージドな形で提供します。
(画像: AWS再入門ブログリレー2022 Amazon GuardDuty 編 | DevelopersIO)
今回はGuardDuty運用で活用できる「抑制ルール」について 使い方を説明します。
抑制するモチベーション
GuardDuty運用では通知実装がほぼ必須です。 驚異検知の内容次第では、早急なセキュリティ対応が求められるからです。 素早く気づき、素早く動けるように仕組み化します。
ただGuardDutyを運用していると、「だいたいの通知が過検知だな」 と感じる人、多いと思います。 私も長く運用しているわけでは無いですが、以下のような過検知を観測しています。
- パブリック用途のS3バケットのブロックパブリックアクセスを無効化したら、検知された ( S3/BucketBlockPublicAccessDisabled )
- 出張先(海外等)からAWS環境にアクセスしたら、検知された ( Discovery:IAMUser/AnomalousBehavior )
- 他メンバーアカウントの集約NATゲートウェイ(グローバルIP)経由でAWS APIを実行したら、検知された ( UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS )
- など…
過検知はノイズになります。 セキュリティ担当者の負荷が大きくなります。 本来見つけたいインシデントを逃すリスクにも繋がります。
負荷を無くすためにも「減らせる検知は減らしていきたい」ですよね。 そのときに役立つのが「抑制ルール」です。
抑制ルールとは
抑制ルール は「条件に一致した新規 検出結果」を自動アーカイブする機能です。 条件の部分は フィルター を組み合わせて作成します。 誤検知の除去に役立ちます。
フィルター は「属性名」と「その値」の組み合わせです。 どのようなフィルターが作成できるかは以下ドキュメントを参照ください。
いくつか代表的なフィルタをピックアップします。
コンソールでの表示名 | 備考 |
---|---|
Account ID(アカウントID) | |
Region (リージョン) | |
Finding Type(検出結果タイプ) | 参考: 検出結果の表 |
Severity (重要度) | 参考: GuardDuty の検出結果の重要度 |
Username (ユーザー名) | |
API caller IPv4 address(API発信者 IPv4アドレス) | |
Instance ID (インスタンスID) | |
Bucket name (バケット名) |
抑制ルールはマネジメントコンソール、もしくは CLI/SDK, IaC などから作成します。 マネジメントコンソールからは過去の検出結果を確認しながら、 フィルターを作成できます。便利です。
抑制ルールの作り方
抑制ルールを作る流れを説明します。
マネジメントコンソールで作成
[GuardDuty > 検出結果] のページに移動します。
まずは 抑制したい検出結果のみに絞る フィルターを作成していきます。 [フィルタの追加] から作成できます。
以下に示すキャプチャでは「検出結果が Discovery:IAMUser/AnomalousBehavior 」 かつ「重要度が Low」 かつ 「アカウントIDが 111111111111
」のフィルタを作成しています。
抑制ルールを作成するには、フィルター作成後に [検出結果の抑制] を選択します。 必要項目を記載後 [保存] を選択して、完了です
「保存済みのルール」に作成したものがあればOKです。 このフィルターにマッチする「将来出てくる検出結果」は自動アーカイブされます。
コードで作成
CloudFormationや Terraformで抑制ルールを作成できます。
まずは Action = NOOP
(抑制しない) に指定して リソースを作成すると良さそうです。 マネコンで結果を確認して、意図したフィルターになっていたら Action = ARCHIVE
(抑制する)に変えて、適用します。
以下に Terraformのサンプルを1つ記載します。
### Provider provider "aws" { region = "ap-northeast-1" } ### Locals locals { detector_id = "a2bfexample" outbound_account_id = "111111111111" } ### Resources # 集約NATゲートウェイ(アカウントID: 111111111111) 経由の AWS API実行」検知を抑制する resource aws_guardduty_filter InstanceCredentialExfiltration_InsideAWS { name = "InstanceCredentialExfiltration_InsideAWS" description = "filter InstanceCredentialExfiltration.InsideAWS findings, via NAT gateway in outbound account." action = "ARCHIVE" rank = 1 detector_id = local.detector_id finding_criteria { criterion { field = "type" equals = [ "UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS" ] } criterion { field = "severity" less_than = "7" # to catch LOW, MEDIUM (not HIGH) findings } criterion { field = "service.action.awsApiCallAction.remoteAccountDetails.accountId" equals = [ local.outbound_account_id, ] } } }
おわりに
GuardDutyの抑制ルールについて説明しました。
頻出している検出結果があり、ノイズとなる場合に使いましょう。
また、フィルターを多く組み合わせて、「該当検知のみ除外」できていること意識します。 本来検知してほしい検出結果がアーカイブされないように注意します。
以上、参考になれば幸いです。